﻿using System.DirectoryServices;
using System.Security.Principal;

namespace Library
{
  /// <summary>
  /// 外部のセキュリティ プリンシパルを表すクラスです。
  /// </summary>
  public sealed class ForeignSecurityPrincipal : DomainObject
  {
    #region プライベートフィールド
    private readonly string _readableName, _displayName;
    #endregion

    #region インターナルコンストラクター
    /// <summary>
    /// <see cref="DirectoryEntry"/> を指定して <see cref="ForeignSecurityPrincipal"/> クラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="entry"><see cref="DirectoryEntry"/>。</param>
    internal ForeignSecurityPrincipal(DirectoryEntry entry)
      : base(entry)
    {
      var objectSid = (byte[])entry.Properties["objectSid"].Value;
      var sid = new SecurityIdentifier(objectSid, 0);   //SID
      var account = (NTAccount)sid.Translate(typeof(NTAccount));  //アカウントに変換
      _readableName = account.Value;  //NT AUTHORITY\○○ => ToStringメソッドでも同じ
      _displayName = System.IO.Path.GetFileName(account.Value);   //NT AUTHORITY\○○ の ○○部分
    }
    #endregion

    #region パブリックプロパティ
    /// <summary>
    /// 表示用の名前を取得します。
    /// </summary>
    public string DisplayName
    {
      get
      {
        return _displayName;
      }
    }

    /// <summary>
    /// 読み取り可能な名前を取得します。
    /// </summary>
    public string ReadableName
    {
      get
      {
        return _readableName;
      }
    }
    #endregion

    #region パブリックメソッド
    /// <summary>
    /// 表示用の名前を返します。
    /// </summary>
    /// <returns>表示用の名前。</returns>
    public override string ToString()
    {
      return this.DisplayName;
    }
    #endregion
  }
}
